package com.catal.audit;

import java.util.Map;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import com.catal.framework.dao.impl.LoggingFormatedJdbcDao;
import com.catal.framework.log.dao.OperLogDao;

/**
 * 在操作完成后记录日志，针对继承LoggingFormatedJdbcDao的dao类
 * @author chensr
 * @version v1.0
 *
 */
public class OperLogAdvice implements MethodInterceptor{

	/**
	 * 授权管理者
	 */
	protected String operUser;
	
	/**
	 * 操作记录DAO
	 */
	protected OperLogDao operLogDao;
	
	/**
	 * 操作对象
	 */
	protected String operObject;
	
	/**
	 * 表名
	 */
	protected String tableName;
	
	private LoggingFormatedJdbcDao loggingJdbcDao;
	private String methodName;
	//执行的方法参数
	private Object[] paramIns;
	
	/**
	 * 
	 * @param map
	 * @return
	 */
	protected String map2Str(Map map){
		if(map == null){
			return "";
		}
		return map.toString().replaceAll("[{}\\s]", "");
	}

	public OperLogDao getOperLogDao() {
		return operLogDao;
	}

	public void setOperLogDao(OperLogDao operLogDao) {
		this.operLogDao = operLogDao;
	}

	public String getOperObject() {
		return operObject;
	}

	public void setOperObject(String operObject) {
		this.operObject = operObject;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public String getOperUser() {
		return operUser;
	}

	public void setOperUser(String operUser) {
		this.operUser = operUser;
	}
	
	@SuppressWarnings("unused")
	public Object invoke(MethodInvocation invocation) throws Throwable {
		//执行的对象
		Object o = invocation.getThis();
		//执行的方法参数
		paramIns = invocation.getArguments();
		//方法名
		methodName = invocation.getMethod().getName();
		
		Object paramReturn = null;

		//其他类对象，不过滤。
		if(!(o instanceof LoggingFormatedJdbcDao)){
			paramReturn = invocation.proceed();
			return paramReturn;
		}
		
		loggingJdbcDao = (LoggingFormatedJdbcDao) o;
		
		String srcRecord = getSrcRecord();
		
		
		//增删改方法返回的值
		paramReturn = invocation.proceed();
		
		init();
		
		//operTypes = {"0":"系统操作","1":"数据新增操作","2":"数据修改操作","3":"数据删除操作"}
//		String desc = "";
//		String operType = "";
//		if("insertRecord".equals(methodName)){//新增操作
//			if(paramReturn != null){
//				return paramReturn;
//			}
//			Map map = (Map) paramIns[0];
//			String mapString = map2Str(map);
//			desc = "新增记录:" + mapString;
//			operType = "1";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}else if("updateRecord".equals(methodName)){//修改操作
//			if(paramReturn != null){
//				return paramReturn;
//			}
//			Map map = (Map) paramIns[0];
//			String mapString = map2Str(map);
//			desc = "记录:" + srcRecord + " 更新为: " + mapString;
//			operType="2";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}else if(methodName.startsWith("delete")){ //删除操作
//			desc = "删除记录:" + srcRecord;
//			operType="3";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}
		
		doLog(srcRecord, paramReturn);
		
		return paramReturn;
	}
	
	private void init() {
//		tableName = loggingJdbcDao.getTableName();
//		operUser = SecurityUtils.getLoginId();
//		operObject = loggingJdbcDao.getOperObject();
//		//操作对象
//		if(operObject == null){
//			operObject = getTableName();
//		}
	}

	/**
	 * 删除或更新时，原记录
	 * @return
	 */
	public String getSrcRecord(){
		String srcRecord = "";
//		if(("updateRecord".equals(methodName))||methodName.startsWith("delete")){ //LoggingFormatedJdbcDao实例 
//			Map record = null;
//			String str = "";
//			try {
//				
//				for(int i = 0 ; i < paramIns.length ; i++){
//					str = str+paramIns[i].toString()+",";
//				}
//				str = str.substring(0,str.length()-1);
//				loggingJdbcDao.initColumnNames();
//				record = loggingJdbcDao.loadByID(str);
//
//			} catch (Exception e) {
//				try {
//					record = loggingJdbcDao.loadByValues((Map) paramIns[0]);
//				} catch (Exception e1) {
//					
//				}
//			}
//			if(record != null){
//				srcRecord = map2Str(record);
//			}else{
//				srcRecord = str;
//			}
//		}
		
		return srcRecord;
	}
	
	/**
	 * 记录
	 * @param srcRecord 源数据
	 * @param paramReturn 方法执行的结果
	 */
	public void doLog(String srcRecord, Object paramReturn){
//		//operTypes = {"0":"系统操作","1":"数据新增操作","2":"数据修改操作","3":"数据删除操作"}
//		String desc = "";
//		String operType = "";
//		if("insertRecord".equals(methodName)){//新增操作
//			if(paramReturn != null){
//				return ;
//			}
//			Map map = (Map) paramIns[0];
//			String mapString = map2Str(map);
//			desc = "新增记录:" + mapString;
//			operType = "1";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}else if("updateRecord".equals(methodName)){//修改操作
//			if(paramReturn != null){
//				return ;
//			}
//			Map map = (Map) paramIns[0];
//			String mapString = map2Str(map);
//			desc = "记录:" + srcRecord + " 更新为: " + mapString;
//			operType="2";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}else if(methodName.startsWith("delete")){ //删除操作
//			desc = "删除记录:" + srcRecord;
//			operType="3";
//			operLogDao.insert(SecurityUtils.getLoginId(), operType,
//					operObject, desc);
//		}
	}
}